<?php

namespace JLPay\Utils;

use Exception;

/**
 * Demo请求处理工具类
 * 提供demo示例中通用的请求发送和响应处理方法
 */
class DemoRequestHandler
{
    /**
     * 通用的请求发送和响应处理方法
     * 
     * @param object $service 服务对象
     * @param object $request 请求对象
     * @param string $operationName 操作名称
     * @param callable $serviceMethod 服务方法调用函数
     * @return object|null
     */
    public static function sendRequestAndHandleResponse(
        object $service,
        object $request,
        string $operationName,
        callable $serviceMethod
    ): ?object {
        $logger = Logger::getInstance();
        
        try {
            $response = $serviceMethod($service, $request);
            
            if ($response->isSuccess()) {
                $logger->info("{$operationName}成功！");
                
                // 打印详细的响应数据
                $logger->info("响应报文：" . json_encode($response->toArray(), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));

                // 如果有分页信息，单独打印
                if (method_exists($response, 'getTotal') && method_exists($response, 'getLimit') && method_exists($response, 'getOffset')) {
                    $total = $response->getTotal();
                    $limit = $response->getLimit();
                    $offset = $response->getOffset();
                    if ($total !== null) {
                        $logger->info("分页信息：总数={$total}, 每页={$limit}, 偏移={$offset}");
                    }
                }
                
                return $response;
            } else {
                $logger->error("{$operationName}失败: {$response->getRetCode()} - {$response->getRetMsg()}");
                // 即使失败也返回响应对象，让调用方能看到完整的响应信息
                return $response;
            }
        } catch (Exception $e) {
            $logger->error("请求异常: " . $e->getMessage());
            return null;
        }
    }
} 